
// 不纯的函数:`isAge`函数的输出不是单单由函数入参决定，也受外部参数`min`影响
let min = 20
function isAge(age){
    return age > min
}
console.log(isAge(22))

// 纯函数 [硬编码]
function isAge1(age){
    let min = 20  // 硬编码：限制死执行语句或fn的变量，只有在执行时显现，不可外部或全局更改。
    return age > min
}
console.log(isAge1(22))

// 纯函数
function isAge2(age,min){
    return age > min
}
console.log(isAge2(22,20))



const _ = require('lodash')

// lodash [使用][memoize,curry]
let array = [1,2,3,4]
console.log(_.first(array)) // 1
console.log(_.last(array)) // 4

function sum (array){ // 纯函数
    console.log('star')
    return array.reduce((total,item)=>total + item) // reduce 里面传入的函数是求和函数，第一个参数`total`是每次调用的返回值，第二个参数`item`是数组的每一项
}
// console.log(sum(array)) // 10
const sumMemory = _.memoize(sum) // `memoize`：`lodash`中可记忆的函数，传入纯函数，输出纯函数。表现以下：
console.log(sumMemory(array)) // star 10 :只有第一次输出`star`，后面调用`sum函数`的时候,直接从缓存中取的值
console.log(sumMemory(array)) // 10
console.log(sumMemory(array)) // 10
console.log(sumMemory(array)) // 10


// 柯里化 [模拟curry]
// `lodash`的柯里化函数 `curry`
const sum2 = function(n1,n2,n3,n4){
    return n1 + n2 + n3 + n4
}
const curry = _.curry(sum2)
console.log(curry(1,3,5,7)) // 16
console.log(curry(1,3)(5,7)) // 16
console.log(curry(1)(3)(5,7)) // 16
console.log(curry(1)(3)(5)(7)) // 16
// 柯里化的含义：多入参的多元函数进行柯里化处理，可以转变成一元函数



// 手写curry





